package com.zf.validation.config;

import jakarta.validation.Validator;
import org.hibernate.validator.HibernateValidatorConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;

import java.nio.charset.StandardCharsets;

/**
 * Validator 配置
 */
@Configuration
public class ValidatorConfig {


    /**
     * 自定义配置校验器，方式1
     */
    @Bean
    public Validator validator() {
        // 创建 Validator FactoryBean
        LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();

        // 添加初始化设置
        validator.setConfigurationInitializer(configuration -> {
            // configuration 对象是 org.hibernate.validator.HibernateValidatorConfiguration extends BaseHibernateValidatorConfiguration 类型

            // 设置快速失败，遇到第一个校验失败，就直接返回，不再进行后续校验，有两种设置方式：
            // 方式1：手动设置属性“hibernate.validator.fail_fast=true”，见 org.hibernate.validator.BaseHibernateValidatorConfiguration#FAIL_FAST 属性
            // 方式2：hibernateValidatorConfiguration.failFast(true)，
            // 方式1的优先级更高，会覆盖方式2，原因见 org.hibernate.validator.internal.engine.ValidatorFactoryConfigurationHelper#determineFailFast

            // 设置快速失败方式1：configuration.addProperty("hibernate.validator.fail_fast", "true");

            if (configuration instanceof HibernateValidatorConfiguration) {
                HibernateValidatorConfiguration hibernateValidatorConfiguration = (HibernateValidatorConfiguration) configuration;
                // 设置快速失败方式2：
                hibernateValidatorConfiguration.failFast(true);
            }

        });

        // ReloadableResourceBundleMessageSource messageSource1 = new ReloadableResourceBundleMessageSource();

        // 创建国际化资源对象
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        // 添加用于生成"校验错误信息"的国际化资源文件名称，默认包含 “ValidationMessages”，即类路径(classpath)下名为 "ValidationMessages" 的 properties 文件
        // messageSource.addBasenames("ValidationMessages");
        // 可以添加多个位置："validate/ValidationMessages"表示取类路径(classpath)下(validate)目录下名为 "ValidationMessages" 的 properties 文件
        messageSource.addBasenames("validate/ValidationMessages", "va/xxx");
        // 文件编码
        messageSource.setDefaultEncoding(StandardCharsets.UTF_8.name());

        // 设置国际化资源对象, 方式1
        validator.setValidationMessageSource(messageSource);
        // 设置国际化资源对象, 方式2
        // validator.setMessageInterpolator(new MessageInterpolatorFactory(messageSource).getObject());

        // 返回 FactoryBean，交由spring创建 Validator 对象
        return validator;
    }

    /**
     * 自定义配置校验器，方式2
     */
    // @Bean
    // public Validator validator() {
    //     // 创建国际化资源对象
    //     ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    //     // 添加用于生成"校验错误信息"的国际化资源文件名称，默认包含 “ValidationMessages”，即类路径(classpath)下名为 "ValidationMessages" 的 properties 文件
    //     // messageSource.addBasenames("ValidationMessages");
    //     // 可以添加多个位置："validate/ValidationMessages"表示取类路径(classpath)下(validate)目录下名为 "ValidationMessages" 的 properties 文件
    //     messageSource.addBasenames("validate/ValidationMessages", "va/xxx");
    //     // 文件编码
    //     messageSource.setDefaultEncoding(StandardCharsets.UTF_8.name());
    //
    //     // 创建 MessageInterpolator 插值器，使用自定义的 国际化资源对象
    //     MessageInterpolator messageInterpolator = new MessageInterpolatorFactory(messageSource).getObject();
    //
    //     // 创建 Validator 工厂
    //     ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
    //             .configure()// 配置类是 org.hibernate.validator.HibernateValidatorConfiguration
    //             // 设置一个 MessageInterpolator
    //             .messageInterpolator(messageInterpolator)
    //             // 快速失败模式
    //             .failFast(true)
    //             .buildValidatorFactory();
    //
    //     try (validatorFactory) {
    //         // 返回一个 Validator 对象
    //         return validatorFactory.getValidator();
    //     }
    // }

}
